<?php

require_once 'BancoDeDados.php';
require_once 'Objeto.php';

class Epoca {

    private $cod_epoca;
    private $seculo;
    private $ano;
    private $mes;
    private $dia;
    private $vinculado;
    private $objeto;

    public function &getCod_epoca() {
        return $this->cod_epoca;
    }

    public function setCod_epoca(&$cod_epoca) {
        $this->cod_epoca = &$cod_epoca;
    }

    public function &getSeculo() {
        return $this->seculo;
    }

    public function setSeculo(&$seculo) {
        $this->seculo = &$seculo;
    }

    public function &getAno() {
        return $this->ano;
    }

    public function setAno(&$ano) {
        $this->ano = &$ano;
    }

    public function &getMes() {
        return $this->mes;
    }

    public function setMes(&$mes) {
        $this->mes = &$mes;
    }

    public function &getDia() {
        return $this->dia;
    }

    public function setDia(&$dia) {
        $this->dia = &$dia;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Época existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into epoca (seculo, ano, mes, dia) values(?,?,?,?)');
        $result = $link->execute($stmt, array($this->seculo, $this->ano, $this->mes, $this->dia));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'seculo' && $this->seculo != $campo_valor) {
            $this->seculo = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Época existente");
            }
        } else if ($campo_id == 'ano' && $this->ano != $campo_valor) {
            $this->ano = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Época existente");
            }
        } else if ($campo_id == 'mes' && $this->mes != $campo_valor) {
            $this->mes = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Época existente");
            }
        } else if ($campo_id == 'dia' && $this->dia != $campo_valor) {
            $this->dia = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Época existente");
            }
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update epoca set ' . $campo_id . ' = ? where cod_epoca = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_epoca));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from epoca where cod_epoca = ?');
        $result = $link->execute($stmt, array($this->cod_epoca));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from epoca');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $epoca = new Epoca();
            $epoca->setCod_epoca($row['cod_epoca']);
            $epoca->setAno($row['ano']);
            $epoca->setMes($row['mes']);
            $epoca->setDia($row['dia']);
            $epoca->setSeculo($row['seculo']);
            $epoca->setVinculado($epoca->verificarVinculacao());
            $resultado[] = &$epoca;
            unset($epoca);
        }
        return $resultado;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_epoca from epoca where seculo = ? and ano = ? and mes = ? and dia = ?', array($this->seculo, $this->ano, $this->mes, $this->dia));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }

    public static function consultar(Objeto &$objeto, &$cod_epoca) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from epoca where cod_epoca = ?', array($cod_epoca));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Época inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Época com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $epoca = new Epoca();
        $epoca->setCod_epoca($row['cod_epoca']);
        $epoca->setAno($row['ano']);
        $epoca->setMes($row['mes']);
        $epoca->setDia($row['dia']);
        $epoca->setSeculo($row['seculo']);
        $epoca->setObjeto($objeto);
        return $epoca;
    }

    private function verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_epoca from objeto where cod_epoca = ?', array($this->cod_epoca));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 1;
        }
        return 0;
    }

    public function cadastrarObjeto() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_epoca from objeto where cod_epoca = ? and cod_interno = ?', array($this->cod_epoca, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            throw new Exception('Época existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_epoca = ? where cod_interno = ?');
        $result = $link->execute($stmt, array($this->cod_epoca, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluirObjeto() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_epoca = null where cod_interno = ?');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

}
?>